const fs = require('fs');
const path = require('path');
/* formidable用于解析表单数据，特别是文件上传 */
const formidable = require('formidable');
/* 用于时间格式化 */
const formatTime = require('silly-datetime');

/* 图片上传 */
module.exports = (req, res) => {
    /* 创建上传表单 */
    let form = new formidable.IncomingForm();
    /* 设置编码格式 */
    form.encoding = 'utf-8';
    /* 设置上传目录 */
    form.uploadDir = path.join(__dirname, './public/img');
    /* 保留文件后缀名 */
    form.keepExtensions = true;
    /* 设置最大文件大小 */
    form.maxFieldsSize = 2 * 1024 * 1024;

    /* 格式化form数据 */
    form.parse(req, (err, fields, files) => {
        let file = files.file;
        /* 如果出错，则拦截 */
        if (err) {
            return next(err)
        }
        if (file.size > form.maxFieldsSize) {
            fs.unlink(file.path);
            return res.status(200).json({
                err_code: -2,
                msg: "图片不能超过2M"
            })
        }

        /* 存储后缀名 */
        let extName = '';

        switch (file.type) {
            case 'image/png':
                extName = 'png';
                break;
            case 'image/x-png':
                extName = 'png';
                break;
            case 'image/jpg':
                extName = 'jpg';
                break;
            case 'image/jpeg':
                extName = 'jpg';
                break;
        }
        if (extName.length == 0) {
            return res.status(200).json({
                err_code: -1,
                msg: "只支持jpg和png格式图片"
            })
        }

        /* 拼接新的文件名 */
        let time = formatTime.format(new Date(), 'YYYYMMDDHHmmss');
        let num = Math.floor(Math.random() * 666 + 888);
        let imageName = `${time}_${num}.${extName}`;
        let newPath = form.uploadDir + '/' + imageName;

        // 文件上传到临时文件目录下，我们还要将临时文件， 移到我们的上传目录中
        fs.rename(file.path, newPath, (err) => {
            if (err) {
                return res.status(200).json({
                    err_code: 500,
                    msg: "图片上传失败"
                })
            } else {
                return res.status(200).json({
                    err_code: 0,
                    msg: "图片上传成功",
                    result: { imageUrl: `http://localhost:3000/public/img/${imageName}` }
                })
            }
        })
    })
}